package com.ewing.util;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Charsets;

public class CodecUtils {
  /**
   * 默认生成的该类的LOG记录器，使用slf4j组件。避免产生编译警告，使用protected修饰符。
   */
  protected final static Logger LOG = LoggerFactory.getLogger(CodecUtils.class);
  
  private static Base64 base64 = new Base64();
  
  public static String encodeBase64(String data){
    if(StringUtils.isEmpty(data)){
      return StringUtils.EMPTY;
    }
    
    return new String(base64.encode(data.getBytes(Charsets.UTF_8)));
  }
  
  public static String decodeBase64(String data){
    if(StringUtils.isEmpty(data)){
      return StringUtils.EMPTY;
    }
    
    return new String(base64.decode(data.getBytes(Charsets.UTF_8)));
  }

  /**
   * 这个算法有缺陷，在数目大于2^17-1时候，会发生逸出，这种情况应该不可能出现
   * @param value
   * @return
   * created by Joeson on 2016年6月10日 下午5:37:00
   */
  public static Integer bigInt(Integer value){
    for(int i=0; i<12; i++){
      value *= 2;
      value++;
    }
    
    return value;
  }
  
  public static Integer smallInt(Integer value){
    for(int i=0; i<12; i++){
      value--;
      value /=2;
    }
    
    return value;
  }
  
  
  @SuppressWarnings("static-access")
  public static String encodeBase64Url(String data){
    if(StringUtils.isEmpty(data)){
      return StringUtils.EMPTY;
    }
    
    return base64.encodeBase64URLSafeString(data.getBytes(Charsets.UTF_8));
  }
  
  public static void main(String[] args) {
    int j=1;
    for(int i=0; i<20; i++){
      j *= 2;
    }
    
    System.out.println(j-1);
    System.out.println(bigInt(1));
    System.out.println(smallInt(bigInt(2)));
  }
  
  
  
}
